#include "Chat.h"
#include "log.h"
#include <stdlib.h>
#include <vector>
#include <stdarg.h>
#include <sys/wait.h>

#define EXIT_ERROR_PARAMETROS 1
#define EXIT_ERROR_SESION     2
#define EXIT_ERROR_FORK       3
#define EXIT_ERROR_EXEC       4

void listarConversaciones(Sesion *sesion){
   std::vector<long> lista = ChatListarTodasLasConversaciones(sesion);

    if(lista.size() == 0)
	log(stdout, "No hay conversaciones.\n");
    for (unsigned int i = 0; i < lista.size(); ++i){
	log(stdout, "Id Conversacion: %ld\n", lista[i]);
    }
}

unsigned lanzarProcesosHijos(const char* nombre, long idUsuario, long idConversacion){
    char usuario[10];
    char conversacion[10];

    sprintf(usuario, "%ld", idUsuario);
    sprintf(conversacion, "%ld", idConversacion);
    log(stdout, "Lanzando proceso %s....\n", nombre);
    
    unsigned childpid=fork();
    if(childpid < 0){
	log(stdout, "Error en el fork proceso %s\n", nombre);
	exit(EXIT_ERROR_FORK);
    }
    if(childpid == 0){
	execlp(nombre, nombre, (const char*) usuario, (const char*) conversacion, (char*) NULL);
	log(stdout, "Error al lanzar %s\n", nombre);
	exit(EXIT_ERROR_EXEC);
    }
    return childpid;
}

long preguntarNumero(){
    log(stdout, "Elija el numero de conversacion (0 para crear una nueva).\n");
    char buffer[50];
    fgets(buffer, 50, stdin);
    return atoi(buffer);
}

int main(int argc, char *argv[]){

    if(argc < 2) {
	log(stdout, "%s <numero usuario>\n", argv[0]);
	exit(EXIT_ERROR_PARAMETROS);
    }

    int numeroUsuario = atoi(argv[1]);

    Sesion* sesion = ChatIniciarSesion(numeroUsuario);
    if(sesion == NULL){
	log(stdout, "No se puede iniciar sesion.\n");
	exit(EXIT_ERROR_SESION);
    }

    listarConversaciones(sesion);

    long id = preguntarNumero();

    if(id == 0){
	id = ChatCrearConversacion(sesion);
	log(stdout, "Creada nueva conversacion %ld.\n", id);
    }

    if(ChatUnirseAConversacion(sesion, id)){

	log(stdout, "Lanzo subprocesos con usuario %ld y conversacion %ld\n", numeroUsuario, id);    

	int pid1 = lanzarProcesosHijos("emisor", numeroUsuario, id);
	int pid2 = lanzarProcesosHijos("receptor", numeroUsuario, id);
	//lanzarProcesosHijos("editor", numeroUsuario, id);
	//lanzarProcesosHijos("control", pid1, pid2);

	waitid(P_PID, pid1, NULL, WEXITED);
	waitid(P_PID,pid2, NULL, WEXITED);

	ChatCerrarConversacion(sesion, id);

	listarConversaciones(sesion);
    }
    
    ChatCerrarSesion(sesion);
    
    return 0;
}
